package cn.lycode.system.service;

import cn.lycode.common.core.domain.entity.SysRole;
import cn.lycode.common.core.domain.model.ConditionDTO;
import cn.lycode.common.core.domain.model.SelectIdsDTO;
import cn.lycode.common.core.page.PageResult;
import cn.lycode.system.domain.dto.ChangeStatusDTO;
import cn.lycode.system.domain.dto.sysrole.SysRoleAddDTO;
import cn.lycode.system.domain.dto.sysrole.SysRoleMenuDTO;
import cn.lycode.system.domain.dto.sysrole.SysRoleUpDTO;
import cn.lycode.system.domain.vo.SysRoleMenuVO;

import java.util.List;
import java.util.Set;

/**
 * <p>
 * 系统角色表 服务类
 * </p>
 *
 * @author sz
 * @since 2022-10-01
 */
public interface SysRoleService {
    /**
     * 通过用户ID获取用户角色名列表
     * 用于安全框架（获取登录用户角色）
     */
    Set<String> selectRoleNameListByUserId(Long userId);

    /**
     * 查询角色列表
     */
    PageResult<SysRole> list(ConditionDTO dto);

    /**
     * 查询所有角色
     */
    List<SysRole> selectRoleAll();

    /**
     * 角色名保证唯一判断
     */
    boolean hasExistsRoleName(String roleName, Long roleId);

    /**
     * 插入角色
     */
    int insertRole(SysRoleAddDTO dto);

    /**
     * 检查角色是否允许被操作，目前代码写死不允许操作超级管理员
     */
    void  checkRoleAllowed(Long roleId);

    /**
     * 禁用\启用角色
     */
    boolean changeRoleStatus(ChangeStatusDTO dto);

    /**
     * 更新角色基本信息
     */
    int update(SysRoleUpDTO dto);

    /**
     * 查询角色具备的菜单及全部菜单
     * @param roleId 角色ID
     * @return 全部菜单树及角色选中的菜单ID
     */
    SysRoleMenuVO queryRoleMenu(Long roleId);

    /**
     * 设置角色具备的菜单权限
     * @param dto 角色id和菜单ids
     */
    void setRoleMenus(SysRoleMenuDTO dto);


    /**
     * 批量删除角色
     */
    int remove(SelectIdsDTO dto);

    /**
     * 计算有多数用户拥有此角色
     */
    int countUserRoleByRoleId(Long roleId);


}
